#include <stdio.h>
#include <stddef.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
#include <wchar.h>
#include <locale.h>
#include <curl/curl.h>
#include <pcre.h>
#include <sqlite3.h>
#include "utils/utils.h"

//#define errno ((int)(__error()))

// 回调函数，用于处理响应数据
size_t write_callback(void *ptr, size_t size, size_t nmemb, char *data) {
    // 将响应数据拷贝到 data 字符串中
    sprintf(data, "%.*s", (int)(size * nmemb), (char *)ptr);
    // 返回已经处理的数据大小
    return size * nmemb;
}

//wchar_t *mbstowcs(const char *mbcs, wchar_t *pwcs, size_t n)
//{
//    int i;
//
//    for (i = 0; mbcs[i] != '\0'; i++) {
//        pwcs[i] = (wchar_t)mbcs[i];
//    }
//
//    pwcs[i] = L'\0';
//
//    return pwcs;
//}

int main() {
    setlocale(LC_ALL, "");

    sqlite3 *db;
    char *errmsg;

    // 打开数据库，ppDb 是两层指针
    int rc3 = sqlite3_open("./my.db", &db);
    if (rc3 != SQLITE_OK) {
        fprintf(stderr, "Error opening database: %s\n", sqlite3_errmsg(db));
        sqlite3_close(db);
        return 1;
    }

    // 创建表
    char *sql = "CREATE TABLE IF NOT EXISTS people (id INTEGER PRIMARY KEY, name TEXT, age INTEGER)";
    rc3 = sqlite3_exec(db, sql, NULL, NULL, &errmsg);
    if (rc3 != SQLITE_OK) {
        fprintf(stderr, "Error creating table: %s\n", errmsg);
        sqlite3_free(errmsg);
        sqlite3_close(db);
        return 1;
    }

    // 插入数据
    sql = "INSERT INTO people (name, age) VALUES ('John Doe', 30)";
    rc3 = sqlite3_exec(db, sql, NULL, NULL, &errmsg);
    if (rc3 != SQLITE_OK) {
        fprintf(stderr, "Error inserting data: %s\n", errmsg);
        sqlite3_free(errmsg);
        sqlite3_close(db);
        return 1;
    }

    // 关闭数据库
    sqlite3_close(db);

    char *str1 = "你好，世界!";
    printf("检查是否为有效的 utf8: %d\n", utf8_is_valid(str1));
//    printf("检查是否为有效的 utf8: %d\n", utf8_isvalid(str1));
//    if (MB_CUR_MAX != 4) {
//        // 设置环境为 UTF-8
//        setlocale(LC_ALL, ""); // 不设置 wcstombs 报 Illegal byte sequence
//    }


//    int a[3][4] = {[0][0] = 1, [1][1] = 2, [2][2] = 3, };
//    int a[3][4] = {1,2,3,4,5,6,7,8,9,10,11,12};
//    int b[3][4] = {{1,2,3,4},{5,6,7,8},{9,10,11,12}};
//    int c[3][4] = {
//            {1,2,3,4},
//            {5,6,7,8},
//            {9,10,11,12},
//    };

    int a[][4] = {1,2,3,4,5,6,7,8,9,10,11,12,13};

    int i, j;

    for (i = 0; i < 4; i++) {
        for (j = 0; j < 4; j++) {
            printf("%d ", a[i][j]);
        }
        printf("\n");
    }

    printf("%d\n", utf8_strlen("he你13你好13"));

    char *test = "asdv你好";
    printf("test 的长度：%d\n", MB_CUR_MAX);

    char *c = utf8_get_char("he你13你好13", 2);
    printf("%s\n", c);

    wchar_t wide_char = L'你'; // 使用 L 前缀定义宽字符
    wchar_t wide_string[] = L"你好，世界！"; // 使用 L 前缀定义宽字符字符串

    // 将宽字符字符串转换为多字节字符串
    size_t len = wcslen(wide_string);
    size_t mbstr_len = len * MB_CUR_MAX + 1;
    printf("多字节字符串: %ld, %ld\n", len, mbstr_len);
    char *mb_string = (char *)malloc(mbstr_len);

    size_t n;
    n = wcstombs(mb_string, wide_string, mbstr_len);
    if (n == (size_t)-1) {
        fprintf(stderr, "wcstombs failed: %s\n", strerror(errno));
        return 1;
    }
    for (i = 0; i < mbstr_len; i++) {
        printf("%d ", mb_string[i]);
        printf("%d ", wide_char);
        printf("%d \n", wide_string[i]);
    }
    printf("\n");
//    mb_string[len] = '\0';

    // 打印多字节字符串
    printf("多字节字符串: %s\n", mb_string);
    free(mb_string);


    wprintf(L"宽字符: %lc\n", wide_char); // 使用 wprintf 打印宽字符
    wprintf(L"宽字符字符串: %ls\n", wide_string); // 使用 wprintf 打印宽字符字符串

    // 定义要匹配的 UTF-8 字符串和正则表达式
    const char *input = "这是一个测试字符串，包含中文字符。13812345678abc";
//    const char *pattern = "/字符/";
    const char *pattern = "1[3-9]\\d{9}";

    // 编译正则表达式
    pcre *re;
    const char *error;
    int erroffset;
    re = pcre_compile(pattern, 0, &error, &erroffset, NULL);
    if (re == NULL) {
        printf("PCRE compilation failed at offset %d: %s\n", erroffset, error);
        return 1;
    }

    // 执行匹配
    int ovector[3];
    int rc = pcre_exec(re, NULL, input, strlen(input), 0, 0, ovector, 3);
    if (rc < 0) {
        if (rc == PCRE_ERROR_NOMATCH) {
            printf("No match\n");
        } else {
            printf("Matching error: %d\n", rc);
        }
        return 1;
    }

    // 打印匹配结果
    printf("Match found at offset %d: %.*s\n", ovector[0], ovector[1] - ovector[0], input + ovector[0]);
    printf("Match found at offset %d: %s\n", ovector[0], input + ovector[0]); //这个不对
    printf("Match found at offset %d - %d\n", ovector[0], ovector[1]);
    // 释放 PCRE 编译结果
    pcre_free(re);

//    wchar_t *str2 = L"\U0001F600";
    const char *str = "Hello, 你好翦\xF0\x9F\x98\x80\xF0\x9F\xA7\x91🧑‍🍳🧑‍🍳world!";
    const char *ptr = str;
    const wchar_t *wstr = (const wchar_t*)ptr; //这种转换没有意义，wcslen(wstr) 还是 strlen

    // 打印结果
    printf("char: %s\n", str);
    printf("wchar_t: %s\n", wstr);
    printf("宽字符字符串: %ld\n", wcslen(wstr));

    return 0;

//    for (i = 0; i < 3; i++) {
//        for (j = 0; j < 4; j++) {
//            printf("%d ", b[i][j]);
//        }
//        printf("\n");
//    }
//
//    for (i = 0; i < 3; i++) {
//        for (j = 0; j < 4; j++) {
//            printf("%d ", c[i][j]);
//        }
//        printf("\n");
//    }

//    CURL *curl;
//    CURLcode res;
//    char response[4096] = ""; // 存储响应数据的字符串（设置小了，容易导致 Segmentation fault）
//
//    // 初始化 libcurl
//    curl_global_init(CURL_GLOBAL_DEFAULT); //可以没有
//    curl = curl_easy_init();
//
//    if (curl) {
//        // 设置请求 URL
//        curl_easy_setopt(curl, CURLOPT_URL, "https://www.baidu.com/");
//
////        // 设置写入回调函数
////        curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, write_callback);
////
////        // 将响应数据传递给 write_callback 函数
////        curl_easy_setopt(curl, CURLOPT_WRITEDATA, response);
//
//        res = curl_easy_perform(curl);
//
////        long response_code;
////        curl_easy_getinfo(curl, CURLINFO_RESPONSE_CODE, &response_code);
//
//        // 检查请求执行是否成功
//        if (res != CURLE_OK) {
//            fprintf(stderr, "Request failed: %s\n", curl_easy_strerror(res));
//        } else {
//            // 打印响应字符串
////            printf("Response: %s\n", response);
//             printf("Response: %s\n", res);
//        }
//
//        // 清理 libcurl
//        curl_easy_cleanup(curl);
//    }
//
//    // 全局清理
//    curl_global_cleanup();
//
//    printf("call utils.c test123(): %d\n", test123());

    return 0;
}



//int a = 10;
//a = 11;
//
//printf("Hello C\n");
//printf("Hello C %d \n", a);
//return 0;

